/**
 * 
 */
package com.roshan.web.service;

import com.roshan.web.dto.DeleteCustomerDetail;
import com.roshan.web.dto.DeleteCustomerDeviceDetail;
import com.roshan.web.dto.DeleteCustomerDeviceProfile;
import com.roshan.web.dto.DeleteCustomerProfile;
import com.roshan.web.dto.DeviceTypeDetail;
import com.roshan.web.dto.DeviceTypeProfile;
import com.roshan.web.dto.RegisterUserDetail;
import com.roshan.web.dto.RetrieveCustomerDevicesDetail;
import com.roshan.web.dto.RetrieveCustomerDevicesProfile;
import com.roshan.web.dto.RetrieveCustomerUrisByEmailDetail;
import com.roshan.web.dto.RetrieveCustomerUrisByEmailResult;
import com.roshan.web.dto.ToggleCustomerDeviceStatusDetail;
import com.roshan.web.dto.ToggleCustomerDeviceStatusProfile;
import com.roshan.web.dto.UpdateUserDetail;
import com.roshan.web.dto.UpdateUserProfile;
import com.roshan.web.dto.UserDetail;
import com.roshan.web.dto.UserProfile;
import com.roshan.web.dto.UserUriProfile;

/**
 * This method provides access to the entity manager web services.
 * 
 * @author roshan
 * @author Dilshan Thambawita
 * 
 */
public interface IEntityManagerService {

    /**
     * Retrieve device type list. This send the request that contains the status, tenant profile uri and the partner
     * profile uri to the customer manager web service and gets the response.
     * 
     * @param deviceTypeProfile the device type profile
     * @return the device type details
     */
    DeviceTypeDetail retrieveDeviceTypeList(DeviceTypeProfile deviceTypeProfile);

    /**
     * Creates the customer by calling customer web services and returns the register user details.
     * 
     * @param user the user to be registered
     * @return the register user detail
     */
    RegisterUserDetail createCustomer(UserProfile userProfile);

    /**
     * Update customer.
     * 
     * @param userProfile the user profile
     * @return the update user detail
     */
    UpdateUserDetail updateCustomer(UpdateUserProfile userProfile);

    /**
     * Retrieve user by its uri by calling customer web services and returns the user.
     * 
     * @param uriProfile the uri profile which contains the user uri
     * @return the retrieved user
     */
    UserDetail retrieveUser(UserUriProfile uriProfile);

    /**
     * Delete customer.
     * 
     * @param deleteCustomerProfile the delete customer profile
     * @return the delete customer detail
     */
    DeleteCustomerDetail deleteCustomer(DeleteCustomerProfile deleteCustomerProfile);

    /**
     * Delete customer device.
     * 
     * @param deleteCustomerDeviceProfile the delete customer device profile
     * @return the delete customer device detail
     */
    DeleteCustomerDeviceDetail deleteCustomerDevice(DeleteCustomerDeviceProfile deleteCustomerDeviceProfile);

    /**
     * Retrieve customer devices.
     * 
     * @param retrieveCustomerDevicesProfile the retrieve customer devices profile
     * @return the retrieve customer devices detail
     */
    RetrieveCustomerDevicesDetail retrieveCustomerDevices(RetrieveCustomerDevicesProfile retrieveCustomerDevicesProfile);

    /**
     * Toggle customer device status.
     * 
     * @param toggleCustomerDeviceStatusProfile the toggle customer device status profile
     * @return the toggle customer device status detail
     */
    ToggleCustomerDeviceStatusDetail toggleCustomerDeviceStatus(
            ToggleCustomerDeviceStatusProfile toggleCustomerDeviceStatusProfile);

    /**
     * Retrieve customer uris by email.
     * 
     * @param retrieveCustomerUrisByEmailDetail the retrieve customer uris by email detail
     * @return the retrieve customer uris by email result
     */
    RetrieveCustomerUrisByEmailResult retrieveCustomerUrisByEmail(
            RetrieveCustomerUrisByEmailDetail retrieveCustomerUrisByEmailDetail);
}
